掌握贪心算法。
设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然 数的乘积最大。 对于给定的正整数n,编程计算最优分解方案。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
publicclass Greed {
privatestaticintk;
/*
* 设n是一个正整数。现在要求将n分解为若干个互不相同的自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。
*/
//int N = 30;
int[] a = newint[100];
intN = this.getN();
publicstaticvoid main(String[] args) {
Greed d = new Greed();
d.greed();
}
privateint getN() {
System.out.println("请输入一个正整数: ");
Scanner scan = new Scanner(System.in);
int a =scan.nextInt();
return a;
//贪心算法
publicvoid greed() {
int count = 0; // 自然数分解次数初始化为0
int sum = 0;
//从2依次开始累计求和
for (int i = 2; sum < N; i++) {
sum = i + sum;
a[i - 2] = i;
count++;
//System.out.println("i="+i+" "+"sum="+sum+" "+"a"+(i-2)+""+a[i]+" "+count);
}
//当sum-N==1时
if (sum - N == 1) {
for (int i = 0; i < count; i++) {
a[i] = a[i + 1]; // 第一个数撤销,其他均向前递进
}
a[count - 2] = a[count - 1] + 1; //最后一个数加上1
a[count - 1] = 0; //该数组的最后一个位置为0
}
elseif (sum - N > 1) {
int tmp = sum - N;
for (int i = 0; i < count; i++) {
if (a[i] == tmp) { //该数组某个位置的值==tmp时,撤销该值,其后索引均向前递进
for (int j = i; j < count; j++) {
a[j] = a[j + 1];
}
a[count - 1] = 0;
count--;
}
}
}
int tmp = 1;
System.out.println(" " + count + "个自然数");
System.out.print(N + "=");
for (int i = 0; i < count; i++) {
if (i < (count - 1)) {
System.out.print(a[i] + "+");
}
if (i == (count - 1)) {
System.out.println(a[i]);
}
}
System.out.print("max=");
for (int i = 0; i < count; i++) {
tmp = tmp * a[i]; //累计求和
if (i < (count - 1)) {
System.out.print(a[i] + "*");
}
if (i == (count - 1)) {
System.out.println(a[i]);
}
}
System.out.println(tmp);
}
}
贪心算法之最大乘积
最新推荐文章于 2024-03-10 13:57:19 发布